package com.superatom.concurrent.share;

/**
 * 本Demo展示的是synchronized使用的锁
 *
 * 方法上的锁默认使用的是当前类进行锁，如果同步块synchronized(this){ }，同样也是使用的是当前类进行锁
 * 在这种情况下，如果一条线程调用了f()方法，另外一条线程就不单单不能调用f()方法，连同g()方法也不行
 *
 * 如果像本例中，g()方法使用syncObject对象上锁，那么，就可以两条线程访问同一个对象的不同方法了。
 */
class DualSynch{
    private Object syncObject = new Object();

    public synchronized void f(){
        for (int i = 0; i < 5; i++) {
            System.out.println("f()");
            Thread.yield();
        }
    }

    public void g(){
        synchronized (syncObject){
            for (int i = 0; i < 5; i++) {
                System.out.println("g()");
                Thread.yield();
            }
        }
    }
}

public class SyncObject {
    public static void main(String[] args) {
        final DualSynch ds = new DualSynch();
        new Thread(){
            @Override
            public void run() {
                ds.f();
            }
        }.start();

        ds.g();
    }
}
